<html>
<script>

    // var o = {x: 1,y:2,z:3}                  // 三个可枚举的自有属性
    // o.propertyIsEnumerable("toString");     // false，不可枚举
    // for (var p in o) {                      // 遍历属性 
    //     console.log(p);                     // 输出x、y和z，不会输出toString
    // }

    // 属性getter和setter 
    // var o = {
    //     // 普通的数据属性
    //     data_prop: value,

    //     // 存储器属性都是成对定义的函数
    //     get accessor_prop() {/* 这里是函数体 */ },
    //     set accessor_prop() {/* 这里是函数体 */ }
    // };

    // 例子 通过原型继承创建一个新的对象
    function inherit(p) {
        if (p == null) { throw TypeError(); }
        if (Object.create) {

        }
        var t = typeof p;
        if (t !== "object" && t !== "function") { throw TypeError(); }
        function f() { };
        f.prototype = p;
        return new f();
    }



    // 例子：
    // var p = {
    //     // x和y是普通的可读的数据属性
    //     x: 1.0,
    //     y: 1.0,
    //     // r是可读写的存取器属性，它有getter和setter
    //     // 函数体结束后不要忘记带上逗号
    //     get r() { return Math.sqrt(this.x * this.x + this.y * this.y) },
    //     set r(newvalue) {
    //         var oldvalue = Math.sqrt(this.x * this.x + this.y * this.y);
    //         var ratio = newvalue / oldvalue;
    //         this.x *= ratio;
    //         this.y *= ratio;
    //     },
    //     // theta 是只读存储器属性，它只有getter方法
    //     get theta() { return Math.atan2(this.y, this.x) }
    // };

    // var q = inherit(p);
    // q.x = 1, q.y = 1;
    // console.log(q.r);
    // console.log(q.theta);


    // var serialnum = {
    //     // 这个数据属性包含下一个序列号
    //     // $符号暗示这个属性是一个私有属性
    //     $n: 1,

    //     // 返回当前值，然后自增
    //     get next() { return this.$n++},
    //     // 给m设置新的值，但只有当它比当前值大的时候才设置成功
    //     set next(n) {
    //         if(n >=this.$n) this.$n = n;
    //         else throw " 序列号的值不能比当前值小"
    //     }
    // };

    // var seri = inherit(serialnum);
    // console.log(seri.next);
    // seri.next(6);
    // console.log(seri.next);



    // 通过调用Object.getOwnProertyDescriptor() 可以获得某个对象特定属性
    // 的属性描写述符

    // console.log(Object.getOwnPropertyDescriptor({a:1},"a"));
    // 返回{value:1,writable:true,enumerable:true,configurable:true}
    // 他们分别代表 "值"、"可读写的" 、 "可枚举的" 、 "能否通过删除属性从而重新定义属性"

    // 这个对象表示有一个可以返回随机数的存取器属性
    //例如，"random.octet"产生一个随机数
    //每次产生的随机数都在0-255之间
    var random = {
        get octet() {
            return Math.floor(Math.random() * 256);
        },
        get uint16() {
            return Math.floor(Math.random() * 65536);
        },
        get int16() {
            return Math.floor(Math.random() * 65536) - 32768;
        }
    }
    console.log(Object.getOwnPropertyDescriptor(random, "octet"));
    // 查询上文中定义的randam对象的属性，返回对象的octet属性
    // 返回{ get: /*func*/,set: underfind,configurable:true}
    console.log(Object.getOwnPropertyDescriptor({}, "x"));
    console.log(Object.getOwnPropertyDescriptor({}, "toString"));
    // 对于继承属性和不存在的属性，返回underfined


    // 想要设置属性的特性，或者让新建属性具有某种特性，则需要调用
    // Object.definePeoperty(),传入要修改的对象、要创建的属性的
    // 名称以及属性描述符对象
</script>



<head>
    <title>放置文章标题</title>
</head>

<body>

</body>

</html>